/**
 *
 * @author Kamil Kajdy & Michał Kuś
 */
package Tanks;

import com.golden.gamedev.Game;
import com.golden.gamedev.GameLoader;
import com.golden.gamedev.object.Background;
import com.golden.gamedev.object.Sprite;
import com.golden.gamedev.object.background.ColorBackground;
import com.golden.gamedev.object.background.ImageBackground;
import com.golden.gamedev.object.*;
import com.golden.gamedev.object.collision.*;
import com.golden.gamedev.*;
import com.golden.gamedev.object.background.*;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.event.KeyEvent;
import java.awt.image.BufferedImage;
import java.io.FileNotFoundException;
import com.golden.gamedev.engine.timer.SystemTimer;

public class Tanks extends Game 
{

    public static void main(String[] args)
    { 
            GameLoader loader = new GameLoader();
            loader.setup(new Tanks(), new Dimension(800,652),false);
            loader.start();
    }
    
    private int i=0,_maxLevel=3;
    private Menu menu;

    //czołg gracza:
    private CzolgGracza player;
     private CzolgPrzeciwnika przeciwnik1,przeciwnik2,przeciwnik3,przeciwnik4;
    private BufferedImage[] _playerImg,_bulletImg,_przeciwnik1Img,_przeciwnik2Img,_przeciwnik3Img,_bonus1Img,_bonus2Img,_bonus3Img,_zycie1Img,_zycie2Img,_zycie3Img;
    private BufferedImage _gameOverImg,_nastepnyPoziomImg;
    //tło:
    private Background bcg;
    private SystemTimer timer;
    //Mapa:

    private Mapa mapa;

    //Grupy sprite'ów do kolizji
    private SpriteGroup PLAYER_G, PLAYER_SHOT_G,ENEMY_G;
    private Sprite _gameOver,_nastepnyPoziom;
    
    
   
    @Override
    public void initResources()
    {
       setMaskColor(Color.black); 
       menu= new Menu(getImage("menu.png"),100,100,getImage("czolgMenu.gif"));
       
       _gameOverImg=getImage("gameOver.png");
       _nastepnyPoziomImg=getImage("nastepnyPoziom.png");
       _bulletImg=getImages("bullet.png",4,1);
       _gameOver=new Sprite(_gameOverImg,0,0);
       _nastepnyPoziom=new Sprite(_nastepnyPoziomImg,0,0);
       Global.setBulletImg(_bulletImg);
       Global.hpDecrease=0;



       Global.k=20;

       Global.gameOver=false;
       Global.enemyOnMap=0;
       Global.enemyToMake=false;

       Global.zniszczenia=new Statystyki();
       
       
       bcg = new ColorBackground(Color.BLACK,getWidth(),getHeight());
       try
       {
            
            mapa = new Mapa("1",getImage("brick.png"),getImage("steel.png"),getImage("tree.png"),getImage("water.png"),getImage("empty.png"),getImage("orzelek.png"));
       }
       catch (FileNotFoundException f)
       {
       }  


       PLAYER_SHOT_G = new SpriteGroup("Player Group");
       Global.ENEMY_SHOT_G = new SpriteGroup("Enemy shot");
       
       this.initCzolgi();

                
                
        setFPS(80);
        
             
   
    }
    
   
     public void initCzolgi(){
         
         //player
       _playerImg= getImages("czołgi.png", 4,1);
       _zycie1Img=getImages("zycia.png", 1,1);
       _zycie2Img=getImages("zycia.png", 1,1);
       _zycie3Img=getImages("zycia.png", 1,1);
       
        player=new CzolgGracza(_playerImg,_zycie1Img,_zycie2Img,_zycie3Img, 600,600,3);
        
        PLAYER_G = new SpriteGroup("Player Group");
        
       PLAYER_G.add(player);
         
                 //przeciwnicy
       _przeciwnik1Img=getImages("przeciwnik1.png",4,1);
       _przeciwnik2Img=getImages("przeciwnik2.png",4,1);
       _przeciwnik3Img=getImages("przeciwnik3.png",4,1);
       
//                przeciwnik1=new CzolgPrzeciwnika(_przeciwnik1Img, 1, 1,3,0.4);
//                przeciwnik2=new CzolgPrzeciwnika(_przeciwnik1Img, 500, 1,3,0.4);
//                przeciwnik3=new CzolgPrzeciwnika(_przeciwnik2Img, 300, 1,3,0.4);
//                przeciwnik4=new CzolgPrzeciwnika(_przeciwnik3Img, 50, 1,3,0.4);

                
                ENEMY_G = new SpriteGroup("Przeciwnicy");
//                ENEMY_G.add(przeciwnik1);
//                ENEMY_G.add(przeciwnik2);
//                ENEMY_G.add(przeciwnik3);
//                ENEMY_G.add(przeciwnik4);
         
         
         
         
         
     }
            void kolizjaCzolg (SpriteGroup grupa1,SpriteGroup grupa2)
            {
            CollisionManager kol = new MapaCollisionTank();
            kol.setCollisionGroup(grupa1, grupa2);
            kol.checkCollision();
            }
            
            void kolizjaPocisk (SpriteGroup grupa1,SpriteGroup grupa2)
            {   
               CollisionManager kol = new MapaCollisionBullet();
               kol.setCollisionGroup(grupa1, grupa2);
               kol.checkCollision();   
            }
            
            void kolizjaGraczPocisk (SpriteGroup g1, SpriteGroup g2)
            {
                CollisionManager kol = new PlayerCollisionBullet();
                kol.setCollisionGroup(g1, g2);
                kol.checkCollision();
            }
            void kolizjaPrzeciwnikPocisk (SpriteGroup g1, SpriteGroup g2)
            {
                CollisionManager kol = new EnemyCollisionBullet();
                kol.setCollisionGroup(g1, g2);
                kol.checkCollision();
            }            
 
    @Override 
    public void update(long l)
    {
        if (menu.graBiegnie())
        {
            if (!(Global.gameOver))
            {
              if((Global.k!=0))  
              {
                player.update(l);
                ENEMY_G.update(l);
                PLAYER_SHOT_G.update(l);
                Global.ENEMY_SHOT_G.update(l);
                if ((Global.enemyOnMap<4)&&(Global.k-Global.enemyOnMap>=0))
                {
                    if (!(Global.enemyToMake))
                    {
                        Global.enemyToMake=true;
                        timer=new SystemTimer();
                        timer.setFPS(this.getFPS());
                        timer.startTimer();
                        Global.currentTime=timer.getTime();
                        
                    }
                    else
                    {
                     
                        if (timer.getTime()-Global.currentTime>1000)
                        {
                            int enemyType=1 + (int)(Math.random() * 3);
                            switch (enemyType)
                            {
                                case 1:
                                    ENEMY_G.add(new CzolgPrzeciwnika(_przeciwnik1Img, Global.newEnemyX, 1,1,0.3));
                                    break;    
                                case 2:
                                    ENEMY_G.add(new CzolgPrzeciwnika(_przeciwnik2Img, Global.newEnemyX, 1,1,0.4));
                                    break;    
                                case 3:
                                    ENEMY_G.add(new CzolgPrzeciwnika(_przeciwnik3Img, Global.newEnemyX, 1,3,0.2));
                                    break;                                         
                            }
                            Global.enemyToMake=false;
                            Global.enemyOnMap++;
                            Global.newEnemyX+=150;
                            Global.newEnemyX%=600;
                            timer.stopTimer();
                        }
                    }
                }
            //sterowanie :
                if (keyDown(KeyEvent.VK_DOWN)) 
                {
                    player.nadol();
                }
                else
                if (keyDown(KeyEvent.VK_UP)) 
                {
                    player.dogory();

                }
                else
                if (keyDown(KeyEvent.VK_LEFT)) 
                {
                    player.wlewo();

                }
                else
                if (keyDown(KeyEvent.VK_RIGHT)) 
                {
                    player.wprawo();

                }
                if (keyPressed(KeyEvent.VK_ESCAPE))
                {
                    Global.gameOver=true;
                }
                if (keyPressed(KeyEvent.VK_SPACE))
                {
                    PLAYER_SHOT_G.add(player.strzal(_bulletImg));
                }

                mapa.kolizjaCzolg(PLAYER_G);
                mapa.kolizjaCzolg(ENEMY_G);
                mapa.kolizjaPocisk(PLAYER_SHOT_G);
                mapa.kolizjaPocisk(Global.ENEMY_SHOT_G);
                mapa.kolizjaOrzel(PLAYER_SHOT_G);
                mapa.kolizjaOrzel(Global.ENEMY_SHOT_G);
                this.kolizjaCzolg(ENEMY_G,PLAYER_G);
                this.kolizjaCzolg(ENEMY_G, ENEMY_G);
                this.kolizjaCzolg(PLAYER_G, ENEMY_G);
                this.kolizjaPrzeciwnikPocisk(ENEMY_G,PLAYER_SHOT_G);
                this.kolizjaGraczPocisk(PLAYER_G, Global.ENEMY_SHOT_G);
                this.kolizjaPocisk(PLAYER_SHOT_G, Global.ENEMY_SHOT_G);
                
              }
              else
              {
                if (keyPressed(KeyEvent.VK_K))
                {
                this.initCzolgi();
                
                Global.k=20;
                if(Global.m<5)
                {
                Global.m++;
                }
                else Global.m=1;
                try
                    {
                        String wybranaMapa=Integer.toString(Global.m);
                        player.forceX(600);
                        player.forceY(600);
                        Global.k=20;
                        mapa = new Mapa(wybranaMapa,getImage("brick.png"),getImage("steel.png"),getImage("tree.png"),getImage("water.png"),getImage("empty.png"),getImage("orzelek.png"));

                    }
                    catch (FileNotFoundException f)
                    {
                    }  
                 }
                }
            }
            else
            {
                if (keyPressed(KeyEvent.VK_A))
                {
                    
                    this.initResources();
                               
                }
            }
            
        }
        else
        {
            if (keyPressed(KeyEvent.VK_DOWN))
            {
                menu.wDol();
                if(i>1)
                {
                    i=0;
                }
                i=i+1;
            }
            if (keyPressed(KeyEvent.VK_UP))
            {
                menu.wGore();
                if(i==0)
                {
                    i=2;
                }
                i=i-1;
                
            }
            if (keyPressed(KeyEvent.VK_ENTER))
            {
                menu.enter();
                if(i==1) this.finish();
            }
        }
        
        
    }
    
    @Override
    public void render(Graphics2D gd)
    {
        bcg.render(gd);
        if (menu.graBiegnie())
        {
           
            
            
            
            
            ENEMY_G.render(gd);
            player.render(gd);
            mapa.wyswietl(gd);
            PLAYER_SHOT_G.render(gd);
            Global.ENEMY_SHOT_G.render(gd);
    
            Graphics2D ga = (Graphics2D)gd;
            ga.setPaint(Color.GRAY);
            ga.fillRect(650,0,150,800);
            player.wyswietl(gd);
            ga.setPaint(Color.GREEN);
            String s = Integer.toString(Global.k);
            ga.drawString("Pozostało czołgów: "+s,660,300);
            Global.zniszczenia.wyswietl(gd);
            if (Global.gameOver)
            {
                
                _gameOver.render(gd);
        
            }
            if(Global.k==0)
            {
               
         
                _nastepnyPoziom.render(gd);
                 _nastepnyPoziom.setActive(true);
            }

    
            
 
        }
        else
        {
            menu.render(gd);
        }
     
    }
    }

class EnemyCollisionBullet extends CollisionGroup 
{
    public EnemyCollisionBullet() 
    {
        
	pixelPerfectCollision = true;
    }
    @Override
   public void collided(Sprite s1, Sprite s2) 
   {
       s1.setActive(false);
       s2.setActive(false);
       Global.zniszczenia.zwiekszPunkty();
      Global.k--;
      Global.enemyOnMap--;
      //s2.setImmutable(_collided);
   }
}
